/*
当一个人欠了很多人的钱，而且遗产不能还清债款的时候，法院可能会采用一种特殊的分配规则：
1.将多个债权人看作多个容量不同的空桶
2.如果遗产不足总债额的一半，将遗产看作水；否则，将亏损看作水
3.同时向这些桶中倒水，每个桶倒水速度一样。
4.直到某个桶装了一半的水，则停止向这个桶倒水，其他桶继续倒。直到所有桶都装够了一半的水

输入格式：
输入分两行
第一行是一个浮点数和一个整数，浮点数是遗产（单位万元），整数是债权人数量
第二行是每个债权人的债额，都是浮点数，单位都是万元
输出格式：
输出每个债权人分到的遗产金额（单位万元）

示例输入：
123.456 4
12 34 56 78
示例输出：
6 17.152 39.152 61.152
*/

#include <iostream>
#include <vector>
#include <numeric>

using std::cout;
using std::cin;
using std::vector;

vector<double> input();        // 读取每个债权人的债额
vector<double> half_pour(const vector<double>& buckets, double water);       // 倒水。water不大于buckets总容量的一半

int main()
{
    cout.sync_with_stdio(false);
    double money;
    cin >> money;
    vector<double> creditors {input()};
    double sum {std::accumulate(creditors.begin(), creditors.end(), 0.0)};
    vector<double> results;
    if (money < sum) {
        bool below_half {money<sum/2};
        double water {(below_half) ? money : sum-money};
        results = half_pour(creditors, water);
        if (not below_half)
            for (unsigned i{}; i!=results.size(); ++i)
                results[i] = creditors[i]-results[i];
    }
    else
        results = std::move(creditors);
    for (auto r : results)
        cout << r << ' ';
    return 0;
}

vector<double> input()
{
    int count;
    cin >> count;
    vector<double> creditors;
    while (count-- != 0) {
        double debt;
        cin >> debt;
        creditors.push_back(debt);
    }
    return creditors;
}

vector<double> half_pour(const vector<double>& buckets, double water)
{
    vector<bool> enough(buckets.size());
    vector<double> results(buckets.size());
    for (auto left=buckets.size(); left!=0; --left) {          // left是剩余未倒够一半的桶的数量
        double min {-1};
        int min_index {};
        for (unsigned i{}; i!=buckets.size(); ++i)
            if (not enough[i] and (min==-1 or buckets[i]<min)) {
                min = buckets[i];
                min_index = i;
            }
        double pour {min/2-results[min_index]};
        if (pour*left >= water) {
            pour = water/left;
            water = 0;
        }
        else
            water -= pour*left;
        for (unsigned i{}; i!=results.size(); ++i)
            if (not enough[i])
                results[i] += pour;
        if (water == 0)
            return results;
        enough[min_index] = true;
    }
    return results;
}

